package la.iok.hzsvn.lewin.movie.shopmovie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.shopmovie.entity.Carpool;
import la.iok.hzsvn.lewin.movie.shopmovie.entity.Player;
import la.iok.hzsvn.lewin.movie.shopmovie.model.CarpoolPlayerCount;
import la.iok.hzsvn.lewin.movie.shopmovie.model.CarpoolReport;
import la.iok.hzsvn.lewin.movie.shopmovie.model.PlayerVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.Collection;
import java.util.List;

public interface PlayerService extends BaseService<Player, Long> {

    @NotNull
    @NotNullElement
    List<Player> listOfCarpoolUsers(@Nullable Collection<Long> carpoolIds, @Nullable Collection<Long> userIds);

    /**
     * 查询指定拼车中所有玩家
     * @param carpoolId 拼车id
     * @return 拼车中玩家列表
     */
    @NotNull
    @NotNullElement
    List<Player> players(@Nullable Long carpoolId);

    /**
     * 保存玩家信息
     * @param userId 玩家id
     * @param carpoolId 拼车id
     * @param guideId 引导玩家的用户id,一般是客服。此时添加之后,玩家归属也是他
     * @return 新保存记录的id
     */
    Long save(Long userId, Long carpoolId, Long guideId);

    @NotNull
    @NotNullElement
    List<PlayerVo> po2vo(@NotNull Carpool carpool, @NotNull @NotNullElement List<Player> list);

    /**
     * 查询用户在拼车中的玩家对象
     * @param carpoolId 拼车id
     * @param userId 用户id
     * @return 玩家对象
     */
    @Nullable
    Player select(@Nullable Long carpoolId, @Nullable Long userId);

    /**
     * 统计对应拼车的玩家数量
     * @param carpoolIds 拼车id列表
     * @return 拼车id对应的玩家数量
     */
    List<CarpoolPlayerCount> carpoolPlayerCounts(Collection<Long> carpoolIds);

    /**
     * 客服推客数据统计
     * @param token 操作用户
     * @param report 参数
     * @return 报表内容
     */
    @NotNull
    CarpoolReport customServicePlayerCountReport(@NotNull Token token, @NotNull CarpoolReport report);

    /**
     * 保存虚拟玩家
     * @param carpoolId 拼车id
     */
    Long saveVirtualPlayer(Long carpoolId, Long userId);

    /**
     * 修改玩家的备注信息
     * @param id 玩家id
     * @param remark 备注内容
     */
    int updateRemark(Long id, String remark);
}
